www.gusucode.com > VC++ 仿SQLServer企业管理器的SQL客户端工具-源码程序 > VC++ 仿SQLServer企业管理器的SQL客户端工具-源码程序/code/FTDB.cpp
#include "stdafx.h" #include "sql.h" #include "sqlext.h" #include "FTDB.h" // Download by http://www.NewXing.com #include "outputCon.h" CFTDB::CFTDB() { m_henv=NULL; m_hdbc=NULL; m_szUser[0]='\0'; } CFTDB::~CFTDB() { Close(); } BOOL CFTDB::Open(void) { Close(); if(SQL_SUCCESS ==SQLAllocEnv(&m_henv)) { if( SQL_SUCCESS==SQLAllocConnect(m_henv,&m_hdbc)) { SWORD cbLen; char szBuf[255]; RETCODE rt=SQLDriverConnect(m_hdbc, ::GetFocus(), NULL, 0, (UCHAR*)szBuf, 255, &cbLen, SQL_DRIVER_COMPLETE); if(SQL_SUCC(rt)) return TRUE; } } Close(); return FALSE; } BOOL CFTDB::Open(LPSTR pszDSN,LPSTR pszUser,LPSTR pszPwd) { Close(); strcpy(m_szUser,pszUser); if(SQL_SUCCESS ==SQLAllocEnv(&m_henv)) { if( SQL_SUCCESS==SQLAllocConnect(m_henv,&m_hdbc)) { RETCODE rt=SQLConnect(m_hdbc, (UCHAR*)pszDSN, strlen(pszDSN), (UCHAR*)pszUser, strlen(pszUser), (UCHAR*)pszPwd, strlen(pszPwd)); if(SQL_SUCC(rt)) return TRUE; } } Close(); return FALSE; } void CFTDB::Close(void) { if(m_hdbc) SQLFreeConnect(m_hdbc); if(m_henv) SQLFreeEnv(m_henv); m_henv=NULL; m_hdbc=NULL; m_arrTableName.RemoveAll(); m_arrColName.RemoveAll(); m_arrColTypeName.RemoveAll(); m_arrColDataPrecision.RemoveAll(); m_arrColDataLength.RemoveAll(); m_arrColDataScale.RemoveAll(); m_arrColDataType.RemoveAll(); m_arrColNullable.RemoveAll(); } BOOL CFTDB::ListAllTable(LPSTR pszType) { if(m_hdbc==NULL) return FALSE; HSTMT hstmt; RETCODE rt=SQLAllocStmt(m_hdbc,&hstmt); SQLSetStmtOption(hstmt,SQL_CONCURRENCY,SQL_CONCUR_READ_ONLY); SQLSetStmtOption(hstmt,SQL_CURSOR_TYPE,SQL_CURSOR_FORWARD_ONLY); if(!SQL_SUCC(rt)) return FALSE; //#define _USE_ORA_TABLE #ifdef _USE_ORA_TABLE char szSQL[]="select tname from tab"; rt=SQLExecDirect(hstmt,(UCHAR*)szSQL,strlen(szSQL)); if(SQL_SUCC(rt)) { m_arrTableName.RemoveAll(); rt = SQLFetch(hstmt); while (TRUE) { char szName[300]; if (SQL_SUCC(rt)) { SDWORD cbName; SQLGetData(hstmt, 1, SQL_C_CHAR, szName, 300, &cbName); } else break; m_arrTableName.Add(szName); rt = SQLFetch(hstmt); } } #else rt=SQLTables(hstmt, NULL, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS, (UCHAR*)pszType, SQL_NTS); int iTail=0; if(SQL_SUCC(rt)) { m_arrTableName.RemoveAll(); rt = SQLFetch(hstmt); while (TRUE) { char szName[300]; if (SQL_SUCC(rt)) { SDWORD cbName; SQLGetData(hstmt, 3, SQL_C_CHAR, szName, 300, &cbName); } else break; m_arrTableName.Add(szName); rt = SQLFetch(hstmt); } } else //AfxMessageBox("table enum error "); DisplayError(hstmt); #endif SQLFreeStmt(hstmt,SQL_CLOSE); #ifdef _DEBUG for(int _i=0;_i<m_arrTableName.GetUpperBound()+1;_i++) TRACE("%d %s\n",_i,m_arrTableName.GetAt(_i)); #endif return TRUE; } BOOL CFTDB::DescTable(int iSel) { if(iSel>=m_arrTableName.GetUpperBound()+1) return FALSE; return DescTable(m_arrTableName.GetAt(iSel)); } BOOL CFTDB::DescTable(LPCSTR pszName) { if(m_hdbc==NULL) return FALSE; HSTMT hstmt; RETCODE rt=SQLAllocStmt(m_hdbc,&hstmt); SQLSetStmtOption(hstmt,SQL_CONCURRENCY,SQL_CONCUR_READ_ONLY); SQLSetStmtOption(hstmt,SQL_CURSOR_TYPE,SQL_CURSOR_FORWARD_ONLY); if(!SQL_SUCC(rt)) return FALSE; //char szSQL[100]; //sprintf(szSQL,"desc %s",pszName); //rt=SQLExecDirect(hstmt,(UCHAR*)szSQL,strlen(szSQL)); char szTName[300]; sprintf(szTName,pszName); TRACE("desc table %s\n",szTName); rt=SQLColumns(hstmt, NULL,//qualifier 0, NULL,//owner 0, (UCHAR*)szTName,//table name SQL_NTS, NULL, 0); int iTail=0; if(SQL_SUCC(rt)) { m_arrColName.RemoveAll(); m_arrColTypeName.RemoveAll(); m_arrColDataLength.RemoveAll(); m_arrColDataPrecision.RemoveAll(); m_arrColDataScale.RemoveAll(); m_arrColDataType.RemoveAll(); m_arrColNullable.RemoveAll(); char szColName[128],szTypeName[128]; SDWORD cbDataType,cbDataPrecision,cbDataScale,cbDataLength,cbNullable; SDWORD cbT; SQLBindCol(hstmt, 4, SQL_C_CHAR, szColName, 128, &cbT); SQLBindCol(hstmt, 5, SQL_C_SLONG, &cbDataType, 0, &cbT); SQLBindCol(hstmt, 6, SQL_C_CHAR, szTypeName, 128, &cbT); SQLBindCol(hstmt, 7, SQL_C_SLONG, &cbDataPrecision, 0, &cbT); SQLBindCol(hstmt, 8, SQL_C_SLONG, &cbDataLength, 0, &cbT); SQLBindCol(hstmt, 9, SQL_C_SSHORT, &cbDataScale, 0, &cbT); SQLBindCol(hstmt, 11, SQL_C_SSHORT, &cbNullable, 0, &cbT); rt = SQLFetch(hstmt); while (TRUE) { if (SQL_SUCC(rt)) { m_arrColName.Add(szColName); m_arrColTypeName.Add(szTypeName); m_arrColDataType.Add((DWORD)cbDataType); m_arrColDataPrecision.Add((DWORD)cbDataPrecision); m_arrColDataLength.Add((DWORD)cbDataLength); m_arrColDataScale.Add((DWORD)cbDataScale); m_arrColNullable.Add((DWORD)cbNullable); rt=SQLFetch(hstmt); } else break; } } SQLFreeStmt(hstmt,SQL_CLOSE); return TRUE; } void CFTDB::DisplayError(HSTMT hstmt) { char szBuf[10],szBuf1[500]; SDWORD cbNError; SWORD cbRet; SQLError(m_henv, m_hdbc, hstmt, (UCHAR*)szBuf, &cbNError, (UCHAR*)szBuf1, 500, &cbRet); //CString szOut; //szOut.Format("%d AfxMessageBox(szBuf1); } void CFTDB::DisplayError(HENV henv,HDBC hdbc,HSTMT hstmt) { char szBuf[10],szBuf1[500]; SDWORD cbNError; SWORD cbRet; SQLError(henv, hdbc, hstmt, (UCHAR*)szBuf, &cbNError, (UCHAR*)szBuf1, 500, &cbRet); //CString szOut; //szOut.Format("%d AfxMessageBox(szBuf1); } BOOL CFTDB::GenerateDescString(CStringArray &arrRes) { arrRes.RemoveAll(); int iTotal=m_arrColName.GetUpperBound()+1; CString szT; for(int i=0;i<iTotal;i++) { DWORD dwType=m_arrColDataType.GetAt(i); switch(dwType) { case(SQL_DECIMAL): case(SQL_NUMERIC): if(m_arrColDataScale.GetAt(i)+m_arrColDataPrecision.GetAt(i) > m_arrColDataLength.GetAt(i)+1) szT.Format("%s %s (%d)", m_arrColName.GetAt(i), m_arrColTypeName.GetAt(i), m_arrColDataPrecision.GetAt(i)); else szT.Format("%s %s (%d.%d)", m_arrColName.GetAt(i), m_arrColTypeName.GetAt(i), m_arrColDataPrecision.GetAt(i), m_arrColDataScale.GetAt(i)); break; case(SQL_CHAR): case(SQL_VARCHAR): szT.Format("%s %s (%d)", m_arrColName.GetAt(i), m_arrColTypeName.GetAt(i), m_arrColDataLength.GetAt(i)); break; default: szT.Format("%s %s",m_arrColName.GetAt(i),m_arrColTypeName.GetAt(i)); break; } //szT.Format("%s %s",m_arrColName.GetAt(i),m_arrColTypeName.GetAt(i)); arrRes.Add(szT); } return iTotal; }